package com.updateeproject.error;

/**
 * 包装器业务异常类实现  BusinessException（类） 和 EmBusinessError（枚举）
 * 都共同继承？（实现）了CommonError这个方法  3-3 11“16
 * 外部不仅可以通过new 一个 BusinessException（类） 和 EmBusinessError（枚举）都可以有errCode和errMsg对应的组装定义
 * 并且需要共同实现setErrMsg的方法，用于将原本Enum中定义的setErrMsg方法覆盖掉
 * <p>
 * <p>
 * 在UserController中使用
 */
public class BusinessException extends/**继承了根的Exception类*/Exception implements CommonError {
    //它内部需要强关联一个CommonError
    /**
     * 这个CommonError就是刚刚Enum的类，并且需要有构造函数需要我们去使用
     */
    private CommonError commonError;//这个成员变量是用来干嘛的??????  当传参！！！
    //引用数据类型的属性是在别的地方设置的，

    //有对应的构造函数需要我们去使用

    /**
     * 第一种直接传入一个CommonError进来
     */
    //这个构造方法的意义：
    //                  直接接收EmBusinessError的传参,用于构造业务异常
    public BusinessException(CommonError commonError) {//传进来“枚举对象”（EmBusinessError）
        /**千万记住要调用super()方法，因为对应Exception自身会有一些初始化机制在里面*/
        super();//Exception会有初始化机制在里面
        this.commonError = commonError;

    }


    //接收自定义errMsg的方式构造业务异常
    public BusinessException(CommonError commonError, String errMsg) {//这个是EmBusiness弄好的“枚举对象”
        super();
        this.commonError = commonError;
        /**通过二次改写errMsg的方式，
         * 完了接着去实现接口*/
        //这个commonError是用的是赋值前的地址值，调用的方法是之前的那个“枚举对象”commonError里的
        this.commonError.setErrMsg(errMsg);//调用的方法是之前的那个“枚举对象”commonError里的方法
        //上面把那个“枚举对象”赋值给了 commonError
        // 把set好(自定义)errMsg的对象  赋值给了commonError
        //谁调用了这个setMsg(errMsg)方法，就把这个对象返回给谁
    }

    //实现这些接口


    //这实现接口里的方法是 给异常对象用的，要get得到属性（commonError）的属性  (errCode errMsg)
    //这实现接口里的方法是 给异常对象用的，要set得到属性（commonError）的属性  (errCode errMsg)
    @Override
    public int getErrCode() {
        /**
         * 通过调用它的getErrCode的方式，
         */
        return this.commonError.getErrCode();//这儿的commonError是谁呢？是“枚举对象”赋值赋过来的吧？ 是
    }

    /**
     * 通过调用它的getErrMsg的方式，
     */
    @Override
    public String getErrMsg() {
        return this.commonError.getErrMsg();
    }

    /**
     * 它也支持setErrMsg，并且return自己
     */
    @Override
    public CommonError setErrMsg(String errMsg) {//这儿可是commonError进行调用的了
        this.commonError.setErrMsg(errMsg);
        //这个是EmBusiness里的set方法，但实际上是异常对象要调用这个方法，则必须在异常类里面又set方法（里面有EmBusiness里的set方法）
        return this;
    }
}
